package types

type Role string

const (
	RoleUser      Role = "user"
	RoleAssistant Role = "assistant"
	RoleSystem    Role = "system"
	RoleTool      Role = "tool"
)

// Request
type Request struct {
	Messages      []Message      `json:"messages"`
	Model         string         `json:"model"`
	Tools         []Tool         `json:"tools,omitempty"`
	ToolChoice    interface{}    `json:"tool_choice,omitempty"`
	Stream        bool           `json:"stream,omitempty"`
	StreamOptions *StreamOptions `json:"stream_options,omitempty"`
}

// Message
type Message struct {
	Content          string     `json:"content"`
	ReasoningContent string     `json:"-"`
	Role             Role       `json:"role"`
	Name             string     `json:"name,omitempty"`
	ToolCallID       string     `json:"tool_call_id,omitempty"`
	ToolCalls        []ToolCall `json:"tool_calls,omitempty"`
}

// StreamOptions
type StreamOptions struct {
	IncludeUsage bool `json:"include_usage"` // 是否在最后一个包中包含usage信息
}

// Tool
type Tool struct {
	Type         string       `json:"type"`
	ToolFunction ToolFunction `json:"function"`
}

// Response
type Response struct {
	ID      string `json:"id"`
	Choices []struct {
		Index        int     `json:"index"`
		FinishReason string  `json:"finish_reason"`
		Message      Message `json:"message"`
	} `json:"choices"`
	Created int64  `json:"created"`
	Model   string `json:"model"`
	Usage   *Usage `json:"usage,omitempty"`

	// 原始调试数据（用于调试和审计）
	RawRequestBody  string `json:"-"` // 原始HTTP请求体
	RawResponseBody string `json:"-"` // 原始HTTP响应体
}

// Usage
type Usage struct {
	PromptTokens     int `json:"prompt_tokens"`
	CompletionTokens int `json:"completion_tokens"`
	TotalTokens      int `json:"total_tokens"`
}

// ToolFunction
type ToolFunction struct {
	Name        string     `json:"name"`
	Description string     `json:"description,omitempty"`
	Parameters  JSONSchema `json:"parameters"`
}

// ToolCall
type ToolCall struct {
	ID string `json:"id"`
	// 当前固定为 "function"
	Type     string           `json:"type"`
	Function ToolCallFunction `json:"function,omitempty"`
}

// ToolCallFunction
type ToolCallFunction struct {
	Name      string `json:"name"`
	Arguments string `json:"arguments"`
}

// StreamResponse
type StreamResponse struct {
	ID      string         `json:"id"`
	Created int64          `json:"created"`
	Model   string         `json:"model"`
	Choices []StreamChoice `json:"choices,omitempty"`
	Usage   *Usage         `json:"usage,omitempty"` // 某些流式响应的最后一个包可能包含usage信息
	Error   error          `json:"-"`

	// 原始数据（仅在最后一个响应中包含）
	RawRequestBody  string `json:"-"` // 原始HTTP请求体
	RawResponseBody string `json:"-"` // 原始SSE响应体（所有行）
}

type StreamChoice struct {
	Delta        StreamChoiceDelta `json:"delta"`
	FinishReason string            `json:"finish_reason,omitempty"`
	Index        int               `json:"index"`
}

type StreamChoiceDelta struct {
	Content          string                 `json:"content,omitempty"`
	ReasoningContent string                 `json:"reasoning_content,omitempty"`
	Role             Role                   `json:"role,omitempty"`
	ToolCalls        []StreamChoiceToolCall `json:"tool_calls,omitempty"`
}

type StreamChoiceToolCall struct {
	Index    int                          `json:"index"`
	ID       string                       `json:"id"`
	Type     string                       `json:"type"`
	Function StreamChoiceToolCallFunction `json:"function"`
}

type StreamChoiceToolCallFunction struct {
	Name      string `json:"name"`
	Arguments string `json:"arguments"`
}
